#ifndef INTERESSE_H_
#define INTERESSE_H_

#include <string>

using namespace std;

/**
 * @class Interesse Interesse.h "src/kisebo/Interesse.h"
 * @brief Classe para controle dos Interesses. \n
 * Utilizar uma pesquisa por interesse, dessa forma fica mais facil encontrar um determinado livro.
*/
class Interesse
{

public:

	/**
	 *  @enum <ENUM_INTERESSE>
	 * 	@brief Enumerator com o tipo de interesse da pesquisa.
	 * 	Enumerator para controlar o tipo de interesse,
	 * 	para saber como a pesquisa deverá ser realizada.
	*/
	enum ENUM_INTERESSE {

		/**
		 * Quando nenhum interesse é selecionado.
		 */
		DESCONHECIDO = -1,

		/**
		 * Tema do livro.
		 */
		TEMA = 1,

		/**
		 * Autor do livro.
		 */
		AUTOR = 2,

		/**
		 * Titulo do livro.
		 */
		TITULO = 3
	};

private:

	/**
	 * Tipo de interesse.
	 */
	ENUM_INTERESSE tipo;

	/**
	 * Valor do interesse, chave de pesquisa.
	 */
	string valor;

public:

	/**
	 * @fn Interesse()
	 * @brief Construtor padrão.
	 * Utilizado para instanciar um novo interesse.
	 */
	Interesse();

	/**
	 * @fn Interesse(const Interesse &_copia)
	 * @brief Construtor por cópia.
	 * @param _copia Objeto por cópia.
	 */
	Interesse(const Interesse& _copia);

	/**
	 * @fn virtual ~Interesse()
	 * @brief Destrutor.
	 * Remove a instancia do objeto, para liberar mémoria.
	 */
	virtual ~Interesse();

	/**
	 * @fn ENUM_INTERESSE GetTipo()
	 * @brief Obtem o tipo de interesse.
	 * @return tipo do interesse.
	 */
	ENUM_INTERESSE GetTipo();

	/**
	 * @fn void SetTipo(ENUM_INTERESSE _tipo)
	 * @brief Insere o tipo de interesse.
	 * @param _tipo Tipo de Interesse.
	 */
	void SetTipo(ENUM_INTERESSE _tipo);

	/**
	 * @fn string GetValor()
	 * @brief Obtem o valor(chave) do interesse.
	 * @return Valor Interessse.
	 */
    string GetValor();

	/**
	 * @fn void SetValor(string _valor)
	 * @brief Insere o valor(chave).
	 * @param _valor Valor Interesse.
	 */
    void SetValor(string _valor);

	/**
	 * @fn bool operator!=(Interesse &_interesse)
	 * @brief Método para verificar se dois Interesses são diferentes.
	 * @param _interesse Informar um interesse para a comparação.
	 * @return true caso sejam diferentes.
	 */
    bool operator!=(Interesse &_interesse);

	/**
	 * @fn friend ostream& operator<<(ostream &_out, const Interesse &_interesse)
	 * @brief Método para impressão de um Interesse.
	 * @param _out Saida da impressão.
	 * @param _interesse Interesse a ser impresso.
	 * @return Interesse formata para impressão.
	 */
    friend ostream& operator<<(ostream &_out, const Interesse &_interesse);

};

#endif /*INTERESSE_H_*/
